package com.qiyue.gate.filter;



import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;


/**
 * Created by y747718944 on 2018/1/17
 *  路由 过滤器
 */
@Component
@Slf4j
public class MyFilter extends ZuulFilter {

    private  static Logger logger= LoggerFactory.getLogger(MyFilter.class);

    @Value("${gate.ignore.startWith}")//startWith: /static,/auth/jwt #路径含有这些字段放行
    private String startWith;

    @Value("${zuul.prefix}")
    private String zuulPrefix; //#为zuul设置一个公共的前缀

    /**
     * filterType：返回一个字符串代表过滤器的类型，在zuul中定义了四种不同生命周期的过滤器类型，具体如下：
         pre：路由之前
         routing：路由之时
         post： 路由之后
         error：发送错误调用
     * @return
     */

    @Override
    public String filterType() {
        return "pre";
    }

    //    filterOrder：过滤的顺序
    @Override
    public int filterOrder() {
        return 0;
    }

    //shouldFilter：这里可以写逻辑判断，是否要过滤，本文true,永远过滤。
    @Override
    public boolean shouldFilter() {
        return false;
    }

    //  run：过滤器的具体逻辑。可用很复杂，包括查sql，nosql去判断该请求到底有没有权限访问。
    @Override
    public Object run() {

        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        logger.info(String.format("请求方法：%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        final String requestUri = request.getRequestURI().substring(zuulPrefix.length());
        final String method = request.getMethod();//请求方法

        // 如果是不进行拦截的地址的地址放行
        if (isStartWith(requestUri)) return null;


        logger.info("ok");

        return null;
    }


    /**
     * URI是否以什么开头
     *
     * @param requestUri
     * @return
     */
    private boolean isStartWith(String requestUri) {
        boolean flag = false;
        for (String s : startWith.split(",")) {
            if (requestUri.startsWith(s)) {
                return true;
            }
        }
        return flag;
    }


    /**
     * 网关抛异常
     *
     * @param body
     * @param code
     */
    private void setFailedRequest(String body, int code) {
        log.debug("Reporting error ({}): {}", code, body);
        RequestContext ctx = RequestContext.getCurrentContext();
        ctx.setResponseStatusCode(code);
        if (ctx.getResponseBody() == null) {
            ctx.setResponseBody(body);
            ctx.setSendZuulResponse(false);
        }
    }
}
